package com.zhj.rabbitmq.work.lunxun;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

/**
 * @author zhj
 */
public class Producer {
    public static void main(String[] args) {
        // 基于 amqp 协议

        // 1. 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.169.131");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
        Connection connection = null;
        Channel channel = null;
        try {
            // 2. 创建连接对象
            connection = connectionFactory.newConnection("生产者");
            // 3. 获取通道
            channel = connection.createChannel();
            // 4. 通过通道创建交换机，声明队列，绑定关系，路由key,发送消息和接收消息
            String queueName01 = "queue01";
            /**
             * @params1 队列名称
             * @params2 是否需要持久化
             * @params3 排他性，是否独占
             * @params4 是否自动删除
             * @params5 附带参数
             */
            channel.queueDeclare(queueName01, false, false, false, null);
            // 5. 准备消息内容
            for (int i = 0; i < 30; i++) {
                String message = "hello rabbit mq " + i;
                // 6. 发送消息给队列queue
                /**
                 * @params1 交换机 "" 默认交换机 可以存在没有交换机的队列吗？不可能
                 * @params2 队列、路由k
                 * @params3 消息状态控制
                 * @params4 消息主题
                 */
                channel.basicPublish("", queueName01, null, message.getBytes(StandardCharsets.UTF_8));
            }
            System.out.println("消息发送成功！");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            // 7. 关闭连接
            if (channel != null && channel.isOpen()) {
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 8. 关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
